function twoSum(nums: number[], target: number): number[][] {
    let left = 0;
    let right = nums.length - 1;
    const result = [];
    while (left < right) {
        const sum = nums[left] + nums[right];
        if (sum === target) {
            // 去重
            if (left > 0 && nums[left] === nums[left - 1]) {
                left++;
                right--;
                continue
            };
            result.push([nums[left], nums[right]])
            // 找到解 循环继续
            left++;
            right--;
        } else if (sum < target) {
            // 小了
            left++;
        } else {
            right--;
        }
    }
    return result
}

function threeSum(nums: number[]): number[][] {
    // 排序前 数组未定义 或者 长度小于三 无解
    if (!nums || nums.length < 3) return []
    nums.sort((a, b) => a - b);
    // 排序后 如果元素都
    if (nums.every((n) => n > 0)) return []
    const result = []
    for (let i = 0; i < nums.length; i++) {
        // 前后相同 跳过 排除重复解
        if (i > 0 && nums[i] === nums[i - 1]) continue
        // 算出另外两数和
        const target = 0 - nums[i];
        // 分割数组
        const list = nums.slice(i + 1, nums.length);
        // 将问题划分为求两数解
        // const result = twoSum(list, target)
        // console.log(list, target, twoSum(list, target))
        twoSum(list, target).forEach((item) => {
            result.push([nums[i], ...item]);
        })
        // result.push([nums[i], ...twoSum(list, target)]);
    }
    console.log(result);
    return result
};

const nums12 = [-2, 0, 0, 2, 2]
threeSum(nums12)